﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ActionTrackerEntities;
using ActionTrackerRules;
using ActionTrackerRules.Helpers;

namespace ActionTrackerWeb.Controllers
{
    public class UsuarioController : Controller
    {
        
        #region ActionResults
        //
        // GET: /Usuario/
        public ActionResult Index()
        {
            if(ValidarUsuario())
            {
                Usuario usuario = (Usuario)Session["UsuarioLogueado"];
                if (usuario.TipoUsuario == (int)TipoUsuarioEnum.Administrador)
                {
                    UsuarioRules oUsuarioRules = new UsuarioRules();
                    List<Usuario> oListUsuarios = oUsuarioRules.GetByFiltro(null, null, false);

                    return View(oListUsuarios);
                }
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }
        
        //
        // GET: /Accion/Create

        public ActionResult Create()
        {
            //ViewBag.TiposUsuarios = ViewBag.TiposUsuarios == null ? new SelectList(GetTipos(), "Value", "Text") : ViewBag.TiposUsuarios;
            if (ValidarUsuario())
            {
                Usuario usuario = (Usuario)Session["UsuarioLogueado"];
                if (usuario.TipoUsuario == (int)TipoUsuarioEnum.Administrador)
                {
                    ViewData["TiposUsuario"] = ViewData["TiposUsuario"] == null ? new SelectList(GetTipos(), "Value", "Text") : ViewData["TiposUsuario"];
                    return View();
                }
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // POST: /Accion/Create

        [HttpPost]
        public ActionResult Create(Usuario modelo)
        {
            try
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();

                switch (oUsuarioRules.Guardar(modelo))
                {
                    case ResponseEnum.Ok:
                        Session["MensajeExito"] = "Se registró el usuario";
                        return RedirectToAction("Index");
                    case ResponseEnum.Error:
                        Session["MensajeError"] = "No se pudo registrar el usuario";
                        return RedirectToAction("Index");
                    case ResponseEnum.EntidadExistente:
                        Session["MensajeError"] = "Existe un usuario con el mismo nombre '"+ modelo.Nombre +"'";
                        return RedirectToAction("Create");
                    default:
                        Session["MensajeError"] = "No se pudo registrar el usuario";
                        return RedirectToAction("Index");
                }
            }
            catch
            {
                Session["MensajeError"] = "No se pudo registrar el usuario";

                return RedirectToAction("Index");
            }
        }

        //
        // GET: /Accion/Edit/5

        public ActionResult Edit(int id)
        {
            if(ValidarUsuario())
            {
                Usuario usuario = (Usuario)Session["UsuarioLogueado"];
                if (usuario.TipoUsuario == (int)TipoUsuarioEnum.Administrador)
                {
                    UsuarioRules oUsuarioRules = new UsuarioRules();
                    Usuario oUsuario = oUsuarioRules.GetById(id);
            
                    ViewData["TiposUsuario"] = ViewData["TiposUsuario"] == null ? new SelectList(GetTipos(), "Value", "Text") : ViewData["TiposUsuario"];

                    return View(oUsuario);
                }
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }
        }

        //
        // POST: /Accion/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, Usuario modelo)
        {
            try
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();
                switch (oUsuarioRules.Actualizar(modelo))
                {
                    case ResponseEnum.Ok:
                        Session["MensajeExito"] = "Se editó el usuario ";
                        return RedirectToAction("Index");
                    case ResponseEnum.Error:
                        Session["MensajeError"] = "No se pudo editar el usuario";
                        return RedirectToAction("Index");
                    case ResponseEnum.EntidadExistente:
                        Session["MensajeError"] = "Existe un usuario con el mismo nombre '" + modelo.Nombre + "'";
                        return RedirectToAction("Edit", new {id = modelo.IdUsuario});
                    default:
                        Session["MensajeError"] = "No se pudo editar el usuario";
                        return RedirectToAction("Index");
                }              

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /Accion/Delete/5

        public ActionResult Delete(int id)
        {
            try
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();
                oUsuarioRules.DarDeBaja(id);

                Session["MensajeExito"] = "Se dió de baja el usuario";

                return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }

        //
        // POST: /Accion/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();
                oUsuarioRules.DarDeBaja(id);

                Session["MensajeExito"] = "Se dió de baja el usuario";

                return RedirectToAction("Index");
            }
            catch
            {
                return RedirectToAction("Index");
            }
        }
        #endregion

        #region Metodos 
        
        #endregion

        #region Metodos de Soporte

        public bool ValidarUsuario()
        {
            Usuario usuario = (Usuario)Session["UsuarioLogueado"];
            if (usuario == null)
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        public List<SelectListItem> GetTipos()
        {
            return new List<SelectListItem>
                       {
                           new SelectListItem
                               {
                                   Text = "Administrador",
                                   Value = "1"
                               },
                           new SelectListItem
                               {
                                   Text = "Usuario",
                                   Value = "2",
                               }
                       };
        }
        #endregion

        #region MetodosAjax

        public string BuscarUsuarios()
        {
            try
            {
                UsuarioRules oUsuarioRules = new UsuarioRules();
                List<Usuario> oListUsuarios = oUsuarioRules.GetByFiltro(null, null, false);

                string oJsonArray = "{ \"aaData\":[";

                bool oBanPrimero = true;

                foreach (var oUsuario in oListUsuarios)
                {
                    string oModelString = "";
                    if (oBanPrimero)
                    {
                        oModelString = "[\"" +
                                      oUsuario.IdUsuario + "\",\"" +
                                      oUsuario.Nombre + "\",\"" +
                                      oUsuario.StrTipoUsuario + "\",\"" +
                                      oUsuario.FechaBaja.Value.ToString("dd/MM/yyyy") + "\"]";
                        oBanPrimero = false;
                    }
                    else
                    {
                        oModelString = ",[\"" +
                                      oUsuario.IdUsuario + "\",\"" +
                                      oUsuario.Nombre + "\",\"" +
                                      oUsuario.StrTipoUsuario + "\",\"" +
                                      oUsuario.FechaBaja.Value.ToString("dd/MM/yyyy") + "\"]";
                    }
                    oJsonArray += oModelString;
                }
                oJsonArray += "]}";

                return oJsonArray;
            }
            catch (Exception ex)
            {
                Response.Redirect("Error.cshtml");
                throw;
            }
        }

        #endregion
    }
}
